package com.example.domain.repository;

import com.example.domain.entity.ItemDiscountRule;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

/**
 * 单品折扣规则Repository
 * 
 * @author Means
 * @since 2025-10-27
 */
@Repository
public interface ItemDiscountRuleRepository extends JpaRepository<ItemDiscountRule, String> {
    
    // ========== 基础查询 ==========
    
    /**
     * 查询未删除的单品折扣规则列表
     * 
     * @param isDeleted 是否删除
     * @return 单品折扣规则列表
     */
    List<ItemDiscountRule> findByIsDeleted(Boolean isDeleted);
    
    /**
     * 根据规则ID查询未删除的单品折扣规则
     * 
     * @param ruleId 规则ID
     * @param isDeleted 是否删除
     * @return 单品折扣规则列表
     */
    List<ItemDiscountRule> findByRuleIdAndIsDeleted(String ruleId, Boolean isDeleted);
    
    /**
     * 根据商品ID查询未删除的单品折扣规则
     * 
     * @param productId 商品ID
     * @param isDeleted 是否删除
     * @return 单品折扣规则列表
     */
    List<ItemDiscountRule> findByProductIdAndIsDeleted(String productId, Boolean isDeleted);
    
    /**
     * 根据规则ID和商品ID查询未删除的单品折扣规则
     * 
     * @param ruleId 规则ID
     * @param productId 商品ID
     * @param isDeleted 是否删除
     * @return 单品折扣规则对象
     */
    Optional<ItemDiscountRule> findByRuleIdAndProductIdAndIsDeleted(String ruleId, String productId, Boolean isDeleted);
    
    // ========== 批量查询 ==========
    
    /**
     * 根据规则ID列表批量查询单品折扣规则
     * 
     * @param ruleIds 规则ID列表
     * @param isDeleted 是否删除
     * @return 单品折扣规则列表
     */
    @Query("SELECT r FROM ItemDiscountRule r WHERE r.ruleId IN :ruleIds AND r.isDeleted = :isDeleted")
    List<ItemDiscountRule> findByRuleIds(@Param("ruleIds") List<String> ruleIds, 
                                        @Param("isDeleted") Boolean isDeleted);
    
    /**
     * 根据商品ID列表批量查询单品折扣规则
     * 
     * @param productIds 商品ID列表
     * @param isDeleted 是否删除
     * @return 单品折扣规则列表
     */
    @Query("SELECT r FROM ItemDiscountRule r WHERE r.productId IN :productIds AND r.isDeleted = :isDeleted")
    List<ItemDiscountRule> findByProductIds(@Param("productIds") List<String> productIds,
                                           @Param("isDeleted") Boolean isDeleted);
    
    // ========== 折扣率查询 ==========
    
    /**
     * 根据折扣率范围查询单品折扣规则
     * 
     * @param minRate 最小折扣率
     * @param maxRate 最大折扣率
     * @param isDeleted 是否删除
     * @return 单品折扣规则列表
     */
    @Query("SELECT r FROM ItemDiscountRule r WHERE r.discountRate BETWEEN :minRate AND :maxRate " +
           "AND r.isDeleted = :isDeleted")
    List<ItemDiscountRule> findByDiscountRateRange(@Param("minRate") BigDecimal minRate,
                                                   @Param("maxRate") BigDecimal maxRate,
                                                   @Param("isDeleted") Boolean isDeleted);
    
    // ========== 自定义查询 ==========
    
    /**
     * 根据ID查询未删除的单品折扣规则
     * 
     * @param id 单品折扣规则ID
     * @return 单品折扣规则对象
     */
    @Query("SELECT r FROM ItemDiscountRule r WHERE r.id = :id AND r.isDeleted = false")
    Optional<ItemDiscountRule> findByIdAndNotDeleted(@Param("id") String id);
    
    /**
     * 查询指定商品的最优折扣（最小折扣率）
     * 
     * @param productId 商品ID
     * @param isDeleted 是否删除
     * @return 最小折扣率
     */
    @Query("SELECT MIN(r.discountRate) FROM ItemDiscountRule r WHERE r.productId = :productId " +
           "AND r.isDeleted = :isDeleted")
    Optional<BigDecimal> findMinDiscountRateByProductId(@Param("productId") String productId,
                                                        @Param("isDeleted") Boolean isDeleted);
    
    /**
     * 统计指定规则的单品折扣数量
     * 
     * @param ruleId 规则ID
     * @param isDeleted 是否删除
     * @return 单品折扣数量
     */
    Long countByRuleIdAndIsDeleted(String ruleId, Boolean isDeleted);
    
    /**
     * 统计指定商品的折扣规则数量
     * 
     * @param productId 商品ID
     * @param isDeleted 是否删除
     * @return 折扣规则数量
     */
    Long countByProductIdAndIsDeleted(String productId, Boolean isDeleted);
    
    /**
     * 检查商品是否有折扣规则
     * 
     * @param productId 商品ID
     * @param isDeleted 是否删除
     * @return 是否存在
     */
    boolean existsByProductIdAndIsDeleted(String productId, Boolean isDeleted);
}

